Software programs frequently go through many version cycles. Often, new versions provide maintenance upgrades, such as security enhancements of fixing bugs. New versions can also provide substantive changes such as altering a user interface (UI) or altering the backend processing or functionality. For example, current Enterprise Resource Planning (ERP) systems help to automate business practices by using sophisticated business logic at a back end and dynamic user interfaces on a front end. These ERP systems are highly adaptable to specific business practices and change frequently to reflect changes in the business environment, or the specific business type that the software is being tailored for. However, in some cases, older “legacy” software includes much of the needed functionality base of a software system and all that is required is to upgrade the legacy software to include some additive functionality and a new UI.
However, legacy software applications may have front-end UIs which may be inseparable from backend transactional logic, such as business logic. Due to the inseparability, the newer software may not be able to utilize and integrate with a newer UI the same or similar transactional logic of the older applications. Companies would thus have to rewrite existing transactional logic for the sole purpose of interacting with the newer interfaces. This creates a significant burden on a company in terms of programming man-hours as well as money.
Additionally, some legacy software applications are stateless in that for a program or application state at a particular moment arrived at after a sequence of a number of other states, a legacy software application or program is unaware of the prior existing states. For example, in the event that a user updates an electronic shopping cart to include additional items, the legacy software application is privy only to the current shopping cart state. Sometimes these legacy software applications do not provide undo/redo capabilities, so that a prior existing state cannot be recalled via an undo action. Modifying program code of a legacy software application to include undo/redo functionality requires an enormous effort and, at times, might not be possible.